package com.tensquare.user.controller;

import com.tensquare.user.pojo.User;
import com.tensquare.user.service.UserService;
import entity.Result;
import entity.StatusCode;
import io.jsonwebtoken.Claims;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;
import util.JwtUtil;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

/**
 * @author Macross
 * @Type UserController.java
 * @Desc
 * @date 2019/12/23 12:11
 */
@RestController
@RequestMapping("/user")
@Api(description = "用户信息控制器")
public class UserController {

    @Autowired
    private UserService userService;
    @Autowired
    private RedisTemplate<String,String> redisTemplate;
    @Autowired
    private JwtUtil jwtUtil;
    @Autowired
    private HttpServletRequest request;

    /**
     * 发送验证码
     * @param mobile 手机号
     * @return
     */
    @PostMapping("/sendsms/{mobile}")
    @ApiOperation(value = "发送短信",notes = "发送注册验证码至指定手机号")
    public Result sendSms(@PathVariable @ApiParam(value = "手机号",required = true) String mobile){
        //发送验证码
        userService.sendSms(mobile);
        //返回发送结果
        return new Result(true,StatusCode.OK,"验证码发送成功");
    }

    /**
     * 添加用户信息
     * @param code 用户输入的验证码
     * @param user 用户信息
     * @return
     */
    @PostMapping("/register/{code}")
    @ApiOperation(value = "注册用户",notes = "先校验验证码是否正确,再注册用户")
    public Result register(@PathVariable @ApiParam(value = "用户输入的验证码",required = true) String code,
                           @RequestBody @ApiParam(value = "用户注册信息",required = true) User user){
        //判断用户输入的验证码以及用户信息对应的手机号是否为空
        if (StringUtils.isNotBlank(code) && StringUtils.isNotBlank(user.getMobile())) {
            //从Redis中获取用户手机号对应的验证码
            String validCode = redisTemplate.boundValueOps(user.getMobile()).get();
            //判断获取的验证码是否为空,以及用户输入的验证码和系统的验证码是否匹配
            if (StringUtils.isNotBlank(validCode) && StringUtils.equals(validCode,code)) {
                //添加用户信息
                userService.addUser(user);
                //返回请求结果
                return new Result(true,StatusCode.OK,"注册成功");
            }else {
                //返回请求结果
                return new Result(false,StatusCode.ERROR,"验证码有误");
            }
            //判断用户输入的验证码是否为空
        } else if (StringUtils.isNotBlank(code)){
            //返回请求结果
            return new Result(false,StatusCode.ERROR,"验证码不能为空");
        } else {
            //返回请求结果
            return new Result(false,StatusCode.ERROR,"手机号不能为空");
        }
    }

    /**
     * 用户登录
     * @param user 登录信息
     * @return
     */
    @PostMapping("/login")
    @ApiOperation(value = "用户登录",notes = "通过手机号以及密码进行登录,返回token")
    public Result<String> login(@RequestBody @ApiParam(value = "用户登录信息",required = true) User user){
        //判断用户输入的手机号和密码是否为空
        if (StringUtils.isNotBlank(user.getPassword()) && StringUtils.isNotBlank(user.getMobile())) {
            //不为空则进行登录校验,返回用户信息
            User loginUser = userService.login(user.getMobile(),user.getPassword());
            //判断用户信息是否为空
            if (loginUser == null){
                //返回请求结果
                return new Result<>(false,StatusCode.LOGIN_ERROR,"手机号或密码有误",null);
            } else {
                //生成用于存放角色数据的map
                Map<String,Object> params = new HashMap<>(1);
                //存放角色
                params.put("roles","user");
                //生成token
                String token = jwtUtil.createToken(params, loginUser.getNickname(), loginUser.getId());
                //返回请求结果以及token
                return new Result<>(true,StatusCode.OK,"登录成功",token);
            }
        }
        //返回请求结果
        return new Result<>(false,StatusCode.LOGIN_ERROR,"输入的手机号或密码不能为空",null);
    }

    /**
     * 删除用户信息
     * @param userId 需要删除的用户ID
     * @return
     */
    @DeleteMapping("/{userId}")
    @ApiOperation(value = "删除用户信息",notes = "删除用户id对应的用户信息")
    public Result delete(@PathVariable @ApiParam(value = "用户ID",required = true) String userId){
        //判断request中的claims对象是否为null
        if (request.getAttribute("claims") != null) {
            //获取claims对象
            Claims claims = (Claims) request.getAttribute("claims");
            //获取角色信息
            String roles = (String) claims.get("roles");
            //判断角色是否为admin
            if (StringUtils.equals(roles,"admin")) {
                //执行删除用户操作
                userService.delete(userId);
                //返回请求状态
                return new Result(true,StatusCode.OK,"操作成功");
            }
        }
        //返回请求状态
        return new Result(false,StatusCode.ACCESS_ERROR,"没有权限执行操作");
    }

    /**
     * 更新用户的粉丝量
     * @param userId 用户ID
     * @param num 更新数量
     * @return
     */
    @PostMapping("/updateFansCount/{userId}/{num}")
    @ApiOperation(value = "更新用户粉丝量")
    public Result updateFansCount(@PathVariable @ApiParam(value = "用户ID",required = true) String userId,
                                  @PathVariable @ApiParam(value = "更新数量",required = true) Integer num){
        //更新粉丝数
        userService.updateFansCount(userId,num);
        //返回
        return new Result(true,StatusCode.OK,"操作成功");
    }

    /**
     * 更新用户的关注数
     * @param userId 用户ID
     * @param num 更新数量
     * @return
     */
    @PostMapping("/updateFollowCount/{userId}/{num}")
    @ApiOperation(value = "更新用户关注数")
    public Result updateFollowCount(@PathVariable @ApiParam(value = "用户ID",required = true) String userId,
                                    @PathVariable @ApiParam(value = "更新数量",required = true) Integer num){
        //更新关注数
        userService.updateFollowCount(userId,num);
        //返回
        return new Result(true,StatusCode.OK,"操作成功");
    }

}
